home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
lang_c
/
bldfuncs
/
bldfuncs.c
< prev
next >
Wrap
Text File
|
1989-04-28
|
6KB
|
304 lines
/*Last revision : Friday April 28, 1989 at 10:21 pm*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define LINT_ARGS
#define TRUE 1
#define FALSE 0
#define OK 0
#define ERROR 1
#define BRACES -2
#define PARENS -3
#define QUOTES -4
char *get_fn_name(char *);
int get_names_one_file(char *,FILE *);
main (argc,argv)
int argc;
char **argv;
{
FILE *fp_out;
char *current_file;
int num_files, i;
if (argc < 2)
{
fprintf(stderr, "Wrong number of parameters");
exit(1);
}
if ((fp_out = fopen("funcs.txt", "w")) == NULL)
{
fprintf(stderr,"can't open %s\n","funcs.txt");
exit(1);
}
printf("Creating funcs.txt...\n");
num_files = argc-1;
for (i=1;i<=num_files;i++)
{
printf("%30s: %3d of %3d files\n",
current_file = strlwr(*++argv),i,num_files);
if (get_names_one_file(current_file,fp_out) != OK)
{
fprintf(stderr,"can't process %s",current_file);
exit(1);
}
}
fclose(fp_out);
exit(0);
}
int get_names_one_file(source_file_name,fp_out)
char *source_file_name;
FILE *fp_out;
{
int line_len,c,got_fn_defn = FALSE;
#define LINE_LEN 8192
char line[LINE_LEN], *name_ptr,fn_name[64];
FILE *fp_source;
if ((fp_source = fopen(source_file_name, "r")) == NULL)
return ERROR;
sprintf(line, "\n%s:", source_file_name);
fprintf(fp_out,line);
while (TRUE)
{
line_len = 0;
while ((c=filter_data(fp_source)) != EOF && c != ';' && c != PARENS)
line[line_len++] = c;
if (c == EOF)
break;
if (c == ';')
continue;
line[line_len] = 0;
strcpy(fn_name,get_fn_name(line));
if (!fn_name[0])
continue;
while ((c=filter_data(fp_source)) != EOF && isspace(c))
;
if (c==';' || c==',')
continue;
if (c==EOF)
break;
while (c != BRACES && c!=EOF)
c=filter_data(fp_source);
fprintf(fp_out,"\n\t%s",fn_name);
got_fn_defn = TRUE;
}
fclose(fp_source);
fputs(got_fn_defn ? ";\n" : "\n\t;\n",fp_out);
return OK;
}
char *
get_fn_name(line)
char *line;
{
char *name_ptr;
int len;
if (!(len = strlen(line)))
return line;
name_ptr = line + len -1;
while (isspace(*name_ptr))
name_ptr--;
*(name_ptr + 1)=0;
while ((isalnum(*name_ptr) || *name_ptr=='_') && name_ptr>=line)
name_ptr--;
if (isdigit(*++name_ptr))
return(name_ptr + strlen(name_ptr));
return name_ptr;
}
int filter_data(fp_source)
FILE *fp_source;
{
int c;
if ((c=filter_parens(fp_source)) != '=')
return c;
while ((c=filter_parens(fp_source)) != ';' && c != EOF)
;
return c;
}
int filter_parens(fp_source)
FILE *fp_source;
{
int paren_cnt, c;
if ((c=filter_curly_braces(fp_source)) != '(')
return c;
paren_cnt = 1;
while (paren_cnt)
switch (filter_curly_braces(fp_source))
{
case ')':
paren_cnt--;
break;
case '(':
paren_cnt++;
break;
case EOF:
return EOF;
}
return PARENS;
}
int filter_curly_braces(fp_source)
FILE *fp_source;
{
int brace_cnt, c;
if ((c=filter_ppdir(fp_source)) != '{')
return c;
brace_cnt = 1;
while (brace_cnt)
switch (filter_ppdir(fp_source))
{
case '}':
brace_cnt--;
break;
case '{':
brace_cnt++;
break;
case EOF:
return EOF;
}
return BRACES;
}
#define MAXLINE 1024
int filter_ppdir(fp_source)
FILE *fp_source;
{
int c,i;
char line[MAXLINE + 1];
while (TRUE)
{
if ((c=filter_quotes(fp_source)) != '#')
return c;
if ((c=get_ppdir_line(fp_source,line)) == EOF)
return EOF;
if (strncmp(line,"define",6))
continue;
if (line[strlen(line) - 1] != '\\')
continue;
else
while (TRUE)
{
if ((c=get_ppdir_line(fp_source)) == EOF)
return EOF;
if (line[strlen(line) -1] != '\\')
break;
}
}
}
int get_ppdir_line(fp_source,line)
FILE *fp_source;
char *line;
{
int i,c;
for (i=0;i<MAXLINE && (c=filter_quotes(fp_source)) != '\n' && c != EOF;i++)
line[i] = c;
line[i] = 0;
if (c==EOF)
return EOF;
return '\n';
}
int filter_quotes(fp_source)
FILE *fp_source;
{
int c1, c2;
if ((c1 = filter_cmt(fp_source)) != '\'' && c1 != '"')
return c1;
while (TRUE)
switch (c2 = filter_cmt(fp_source))
{
case '\\':
filter_cmt(fp_source);
break;
case EOF:
return EOF;
default:
if (c2 == c1)
return QUOTES;
}
}
int filter_cmt(fp_source)
FILE *fp_source;
{
#define STABLE 0
#define IN_CMT_FS 1
#define OUT_CMT_STAR 2
int c, state=STABLE, cmt_level=0;
while (TRUE)
{
c=fgetc(fp_source);
if (c==EOF)
return EOF;
switch (state)
{
case STABLE:
if (c=='*')
state=OUT_CMT_STAR;
else if (c=='/')
state= IN_CMT_FS;
break;
case IN_CMT_FS:
if (c=='*')
{
state=STABLE;
cmt_level++;
continue;
}
else if (!cmt_level)
{
ungetc(c,fp_source);
return '/';
}
else if (c != '/')
state=STABLE;
break;
case OUT_CMT_STAR:
if (c=='/')
{
cmt_level--;
state=STABLE;
continue;
}
else if (!cmt_level)
{
ungetc(c,fp_source);
return '*';
}
else if (c!='*')
state=STABLE;
break;
}
if (state==STABLE && !cmt_level)
return c;
}
}